#include "liste.H"
#include <cstdio>

#include "element.H"

void initialise(Liste & l)
{
  l.ad = NULL;
  l.nb_elem = 0;
}

void ajoutEnTete(const Elem & e, Liste & l)
{
  Cellule *c;
  c=new Cellule;
  c->info = e;
  c->suivant = NULL;
  if (l.ad == NULL)
    {
      l.ad = c;
      l.nb_elem ++;
    }
  else
    {
      c->suivant = l.ad;
      l.ad = c;
      l.nb_elem ++;
    }
}

void ajoutEnQueue(const Elem & e, Liste & l)
{
  Cellule *c1 = l.ad;
  Cellule *c2;
  c2=new Cellule;
  if (l.ad == NULL)
    {
      c2->info = e;
      c2->suivant = NULL;
      l.ad = c2;
      l.nb_elem ++;
    }
  else
    {
      for(int i=0;i<l.nb_elem-1;i++)
	{
	  c1 = c1->suivant;
	}
      c2->info = e;
      c2->suivant = NULL;
      c1->suivant = c2;
      l.nb_elem++;
    }
}

void affichageListe(const Liste & l)
{
  Cellule * c;
  c=new Cellule;
  c = l.ad;
  int i;
  for (i=0;i<l.nb_elem;i++)
    {
      std::printf("%d \n",c->info);
      c=c->suivant;
    }
  delete c;
}

void initialise(Liste & l1, const Liste & l2)
{
  Cellule *c;
  c = l2.ad;
  initialise(l1);
  for (int i = 0; i<l2.nb_elem;i++)
    {
      ajoutEnQueue(c->info,l1);
      c=c->suivant;
    }
}

void videListe(Liste & l)
{
  Cellule * vide;
  while(l.ad != NULL)
    {
      vide=l.ad;
      l.ad=l.ad->suivant;
      delete vide;
      l.nb_elem --;
    }
}

bool testListeVide(const Liste & l)
{
  if(l.ad == NULL)
    {
      return true;
    }
  else
    {
      return false;
    }
}

void affectation(Liste & l1,const Liste & l2)
{
  videListe(l1);
  Cellule *c;
  c=l2.ad;
  for (int i = 0; i<l2.nb_elem; i++)
    {
      ajoutEnQueue(c->info,l1);
      c=c->suivant;
    }
}

void testament(Liste & l)
{
  videListe(l);
  //delete l;  si la liste avait ete creee dans le tas.
}

Elem premierElement(const Liste & l)
{
  return(l.ad->info);
}


Cellule * premiereCellule(const Liste & l)
{
  return(l.ad);
}

Cellule * celluleSuivante(const Cellule * c, const Liste & l)
{
  Cellule * c2;
  c2= l.ad;
  while(c2 != c)
    {
      c2 = c2->suivant;
    }
  return c2->suivant;
}

Elem elementCellule(const Cellule * c)
{
  return c->info;
}

void suppressionEnTete(Liste & l)
{
  Cellule * vide;
  vide = l.ad;
  l.ad=l.ad->suivant;
  l.nb_elem --;
  delete vide;
}
